package com.xiaoleilu.hutool.util;

import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;

import org.dromara.hutool.core.util.ByteUtil;

import com.xiaoleilu.hutool.exceptions.UtilException;

/**
 * 压缩工具类
 *
 * @author Looly
 */
public class ZipUtil {

    /**
     * 默认编码，使用平台相关编码
     */
    private static final Charset DEFAULT_CHARSET = CharsetUtil.defaultCharset();

    /**
     * 打包到当前目录，使用默认编码UTF-8
     *
     * @param srcPath 源文件路径
     * @return 打包好的压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(String srcPath) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcPath);
    }

    /**
     * 打包到当前目录
     *
     * @param srcPath 源文件路径
     * @param charset 编码
     * @return 打包好的压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(String srcPath, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcPath, charset);
    }

    /**
     * 打包到当前目录，使用默认编码UTF-8
     *
     * @param srcFile 源文件或目录
     * @return 打包好的压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(File srcFile) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcFile);
    }

    /**
     * 打包到当前目录
     *
     * @param srcFile 源文件或目录
     * @param charset 编码
     * @return 打包好的压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(File srcFile, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcFile, charset);
    }

    /**
     * 对文件或文件目录进行压缩<br>
     * 不包含被打包目录
     *
     * @param srcPath 要压缩的源文件路径。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
     * @param zipPath 压缩文件保存的路径，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @return 压缩好的Zip文件
     * @throws UtilException IO异常
     */
    public static File zip(String srcPath, String zipPath) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcPath, zipPath);
    }

    /**
     * 对文件或文件目录进行压缩<br>
     *
     * @param srcPath 要压缩的源文件路径。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
     * @param zipPath 压缩文件保存的路径，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param withSrcDir 是否包含被打包目录
     * @return 压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(String srcPath, String zipPath, boolean withSrcDir) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcPath, zipPath, withSrcDir);
    }

    /**
     * 对文件或文件目录进行压缩<br>
     *
     * @param srcPath 要压缩的源文件路径。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
     * @param zipPath 压缩文件保存的路径，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param charset 编码
     * @param withSrcDir 是否包含被打包目录
     * @return 压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(String srcPath, String zipPath, Charset charset, boolean withSrcDir) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(srcPath, zipPath, charset, withSrcDir);
    }

    /**
     * 对文件或文件目录进行压缩<br>
     * 使用默认UTF-8编码
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param withSrcDir 是否包含被打包目录
     * @param srcFiles 要压缩的源文件或目录。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
     * @return 压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(File zipFile, boolean withSrcDir, File... srcFiles) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, withSrcDir, srcFiles);
    }

    /**
     * 对文件或文件目录进行压缩
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param charset 编码
     * @param withSrcDir 是否包含被打包目录
     * @param srcFiles 要压缩的源文件或目录。如果压缩一个文件，则为该文件的全路径；如果压缩一个目录，则为该目录的顶层目录路径
     * @return 压缩文件
     * @throws UtilException IO异常
     */
    public static File zip(File zipFile, Charset charset, boolean withSrcDir, File... srcFiles) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, charset, withSrcDir, srcFiles);
    }

    /**
     * 对流中的数据加入到压缩文件，使用默认UTF-8编码
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param path 流数据在压缩文件中的路径或文件名
     * @param data 要压缩的数据
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.0.6
     */
    public static File zip(File zipFile, String path, String data) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, path, data);
    }

    /**
     * 对流中的数据加入到压缩文件<br>
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param path 流数据在压缩文件中的路径或文件名
     * @param data 要压缩的数据
     * @param charset 编码
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File zip(File zipFile, String path, String data, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, path, data, charset);
    }

    /**
     * 对流中的数据加入到压缩文件<br>
     * 使用默认编码UTF-8
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param path 流数据在压缩文件中的路径或文件名
     * @param in 要压缩的源
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.0.6
     */
    public static File zip(File zipFile, String path, InputStream in) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, path, in);
    }

    /**
     * 对流中的数据加入到压缩文件<br>
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param path 流数据在压缩文件中的路径或文件名
     * @param in 要压缩的源
     * @param charset 编码
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File zip(File zipFile, String path, InputStream in, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, path, in, charset);
    }

    /**
     * 对流中的数据加入到压缩文件<br>
     * 路径列表和流列表长度必须一致
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param paths 流数据在压缩文件中的路径或文件名
     * @param ins 要压缩的源
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.0.9
     */
    public static File zip(File zipFile, String[] paths, InputStream[] ins) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, paths, ins);
    }

    /**
     * 对流中的数据加入到压缩文件<br>
     * 路径列表和流列表长度必须一致
     *
     * @param zipFile 生成的Zip文件，包括文件名。注意：zipPath不能是srcPath路径下的子文件夹
     * @param paths 流数据在压缩文件中的路径或文件名
     * @param ins 要压缩的源
     * @param charset 编码
     * @return 压缩文件
     * @throws UtilException IO异常
     * @since 3.0.9
     */
    public static File zip(File zipFile, String[] paths, InputStream[] ins, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.zip(zipFile, paths, ins, charset);
    }

    //---------------------------------------------------------------------------------------------- Unzip
    /**
     * 解压到文件名相同的目录中，默认编码UTF-8
     *
     * @param zipFilePath 压缩文件路径
     * @return 解压的目录
     * @throws UtilException IO异常
     */
    public static File unzip(String zipFilePath) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFilePath);
    }

    /**
     * 解压到文件名相同的目录中
     *
     * @param zipFilePath 压缩文件路径
     * @param charset 编码
     * @return 解压的目录
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File unzip(String zipFilePath, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFilePath, charset);
    }

    /**
     * 解压到文件名相同的目录中，使用UTF-8编码
     *
     * @param zipFile 压缩文件
     * @return 解压的目录
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File unzip(File zipFile) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFile);
    }

    /**
     * 解压到文件名相同的目录中
     *
     * @param zipFile 压缩文件
     * @param charset 编码
     * @return 解压的目录
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File unzip(File zipFile, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFile, charset);
    }

    /**
     * 解压，默认UTF-8编码
     *
     * @param zipFilePath 压缩文件的路径
     * @param outFileDir 解压到的目录
     * @return 解压的目录
     * @throws UtilException IO异常
     */
    public static File unzip(String zipFilePath, String outFileDir) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFilePath, outFileDir);
    }

    /**
     * 解压
     *
     * @param zipFilePath 压缩文件的路径
     * @param outFileDir 解压到的目录
     * @param charset 编码
     * @return 解压的目录
     * @throws UtilException IO异常
     */
    public static File unzip(String zipFilePath, String outFileDir, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFilePath, outFileDir, charset);
    }

    /**
     * 解压，默认使用UTF-8编码
     *
     * @param zipFile zip文件
     * @param outFile 解压到的目录
     * @return 解压的目录
     * @throws UtilException IO异常
     */
    public static File unzip(File zipFile, File outFile) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFile, outFile);
    }

    /**
     * 解压
     *
     * @param zipFile zip文件
     * @param outFile 解压到的目录
     * @param charset 编码
     * @return 解压的目录
     * @throws UtilException IO异常
     * @since 3.2.2
     */
    public static File unzip(File zipFile, File outFile, Charset charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unzip(zipFile, outFile, charset);
    }

    // ----------------------------------------------------------------------------- Gzip
    /**
     * Gzip压缩处理
     *
     * @param content 被压缩的字符串
     * @param charset 编码
     * @return 压缩后的字节流
     * @throws UtilException IO异常
     */
    public static byte[] gzip(String content, String charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.gzip(ByteUtil.toBytes(content, Charset.forName(charset)));
    }

    /**
     * Gzip压缩处理
     *
     * @param val 被压缩的字节流
     * @return 压缩后的字节流
     * @throws UtilException IO异常
     */
    public static byte[] gzip(byte[] val) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.gzip(val);
    }

    /**
     * Gzip压缩文件
     *
     * @param file 被压缩的文件
     * @return 压缩后的字节流
     * @throws UtilException IO异常
     */
    public static byte[] gzip(File file) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.gzip(file);
    }

    /**
     * Gzip解压缩处理
     *
     * @param buf 压缩过的字节流
     * @param charset 编码
     * @return 解压后的字符串
     * @throws UtilException IO异常
     */
    public static String unGzip(byte[] buf, String charset) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unGzip(buf, Charset.forName(charset));
    }

    /**
     * Gzip解压处理
     *
     * @param buf buf
     * @return bytes
     * @throws UtilException IO异常
     */
    public static byte[] unGzip(byte[] buf) throws UtilException {
        return org.dromara.hutool.core.compress.ZipUtil.unGzip(buf);
    }

}